//
//  HYRefreshControl.swift
//  weibo-01
//
//  Created by 源 何 on 16/9/29.
//  Copyright © 2016年 何源. All rights reserved.
//

import UIKit

//实时获取 tableView 的 contentOffset (属性)的变化
//刷新控件需要监听 tableView 的 contenOffset 的变化
/*
 1.添加监听者,监听属性变化
 2.实现KVO的监听方法 这个方法必须要实现,如果不程序会 boom
 3.在 deinit 方法中移除监听者
 */
private let refreshHeight: CGFloat = 50

class HYRefreshControl: UIControl {

    //所有构造函数最终会调用到指定的构造函数
    override init(frame: CGRect) {
        let rect = CGRect(x: 0, y: -refreshHeight, width: ScreenWidth
            , height: refreshHeight)
        super.init(frame: rect)
        self.backgroundColor = randomColor()
        setupUI()
    }
    
    required init?(coder aDecoder: NSCoder) {
        fatalError("init(coder:) has not been implemented")
    }
    
    private func setupUI() {
        addSubview(tipLabel)
        addSubview(indicator)
        addSubview(arrowIcon)
        
        //设置约束
        tipLabel.snp.makeConstraints { (make) in
            make.centerX.equalTo(self).offset(10)
            make.centerY.equalTo(self)
        }
        
        //不动画的时候是隐藏的
        indicator.snp.makeConstraints { (make) in
            make.centerY.equalTo(self)
            make.right.equalTo(tipLabel.snp.left).offset(-5)
        }
        
        arrowIcon.snp.makeConstraints { (make) in
            make.center.equalTo(indicator)
        }
    }
    
    private var scrollView: UIScrollView?
    
    //懒加载子控件
    //箭头控件
    private lazy var arrowIcon: UIImageView = UIImageView(image: UIImage(named: "tableview_pull_refresh"))
    //提示文字
    private lazy var tipLabel: UILabel = UILabel(title: "下拉刷新", textColor: UIColor.orange, fontSize: 14)
    //菊花按钮
    private lazy var indicator = UIActivityIndicatorView(activityIndicatorStyle: .white)
    
    override func observeValue(forKeyPath keyPath: String?, of object: Any?, change: [NSKeyValueChangeKey : Any]?, context: UnsafeMutableRawPointer?) {
        //1.滚动视图的contentOffset.y
        let offsetY = scrollView?.contentOffset.y ?? 0
        //2.确定临界值 -114 -(64 + 50)
        //比较这两个值
        let targetY: CGFloat = -144
        if scrollView!.isDragging {
            //正在拽动
            if offsetY < targetY {
                //小于 处于准备刷新状态
            } else {
                //大于 默认状态
            }
        } else {
            //如果是准备刷新状态 并且用户已经松手 就应该是 正在刷新状态
        }
    }
    
    //该方法是UIView的方法
    //当该视图将要移动到新的父视图上的时候 系统会自动调用该方法
    //刷新控件只能够给UIScrollView及其子类添加才有意义
    override func willMove(toSuperview newSuperview: UIView?) {
        super.willMove(toSuperview: newSuperview)
        if let fatherView = newSuperview as? UIScrollView {
            //如果父视图是滚动视图 就监听contentOffset
            self.scrollView = fatherView
            fatherView.addObserver(self, forKeyPath: "contentOffset", options: .new, context: nil)
        }
    }
    
    deinit {
        self.scrollView?.removeObserver(self, forKeyPath: "contentOffset")
    }
}
